package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFormat;
	
	/**
	 * Главный класс, создающий персонажа и обрабатывающий его действия.
	 */
	public class Main extends Sprite 
	{
		public var killCount:int = 0;
		public var scores:int = 0;
		public var maxJump:int = 0;
		public var txtKillCount:TextField;
		public var txtScores:TextField;
		public var txtMaxJump:TextField;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			var fmtInfo:TextFormat = new TextFormat("_sans", 15, 0xff0000, true);
			
			/* Поле "Кол-во убитых" */
			txtKillCount = new TextField();
			txtKillCount.x = 10;
			txtKillCount.y = 40;
			txtKillCount.width = 200;
			txtKillCount.defaultTextFormat = fmtInfo;
			addChild(txtKillCount);
			
			/* Поле "Кол-во очков" */
			txtScores = new TextField();
			txtScores.x = 10;
			txtScores.y = 70;
			txtScores.width = 200;
			txtScores.defaultTextFormat = fmtInfo;
			addChild(txtScores);
			
			/* Поле "Максимальный прыжок" */
			txtMaxJump = new TextField();
			txtMaxJump.x = 10;
			txtMaxJump.y = 100;
			txtMaxJump.width = 200;
			txtMaxJump.defaultTextFormat = fmtInfo;
			addChild(txtMaxJump);
			
			updateInfo();
			
			var hero:MyHero = new MyHero();
			addChild(hero);
			
			/* Определяем обработчик в дочернем объекте - hero */
			//hero.addEventListener(MyHeroEvent.ON_WALK, heroActions);
			//hero.addEventListener(MyHeroEvent.ON_KILL, heroActions);
			//hero.addEventListener(MyHeroEvent.ON_JUMP, heroActions);
			//hero.addEventListener(MyHeroEvent.ON_SIT, heroActions);
			
			/* Объявляем обработчик в родителе */
			addEventListener(MyHeroEvent.ON_WALK, heroActions);
			addEventListener(MyHeroEvent.ON_KILL, heroActions);
			addEventListener(MyHeroEvent.ON_JUMP, heroActions);
			addEventListener(MyHeroEvent.ON_SIT, heroActions);
			
		}
		
		/* Обновление данных интерфейса */
		private function updateInfo():void
		{
			txtKillCount.text = "Убитых: "+killCount.toString();
			txtScores.text = "Очки: "+scores.toString();
			txtMaxJump.text = "Макс. прыжок: "+maxJump.toString();
		}
		
		/* Ловля события приходящих от героя */
		private function heroActions(e:MyHeroEvent):void
		{
			switch(e.type)
			{
				/* Если кого-то убил, то добавим очков */
				case MyHeroEvent.ON_KILL:
				killCount++;
				scores += e.param as int;
				trace("Противник убит. Получено опыта: "+e.param.toString());
				break;
				
				/* Обработка прыжка. Запишем самый высокий прыжок. */
				case MyHeroEvent.ON_JUMP:
				var curJump:Number = e.param as int;
				if (curJump > maxJump) maxJump = curJump;
				trace("Герой прыгнул на высоту (см): "+curJump.toString());
				break;
				
				case MyHeroEvent.ON_WALK:
				trace("Герой в пути.");
				break;
				
				case MyHeroEvent.ON_SIT:
				trace("Герой устроил привал.");
				break;
				
				default:
				trace(e.type);
				break;
			}
			updateInfo();
			
			/* Вытаскиваем событие из конвеера, дабы не распространялось выше по иерархии */
			e.stopPropagation();
			
			/* e.currentTarget - указывает на текущий объект(наследованный от EventDispatcher), который обрабатывает событие */
			/* e.target - указывает на объект который инициализировал событие. В данном случае объект MyHero */
			
		}
		
	}
	
}